#!/bin/bash
########################################################################
####  Script Name: sm-lib-distro-conversion
####  version: 3.3.17
####  Date: 2014-03-29

####  Copyright (C) Harald Hope 2005-2014
####  This program is free software; you can redistribute it and/or modify it under
####  the terms of the GNU General Public License as published by the Free Software
####  Foundation; either version 2 of the License, or (at your option) any later version.

####  This program is distributed in the hope that it will be useful, but WITHOUT
####  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
####  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

####  Get the full text of the GPL here:
####  http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

####  Script Author: Harald Hope
####  This is a library file for smxi and cannot be run independently

####  Script URL: http://smxi.org/sm/sm-lib-distro-conversion
####  Script SVN: http://code.google.com/p/smxi
####  Script Home page: http://techpatterns.com/forums/about736.html
########################################################################

B_OFFER_LIQUORIX_KERNELS='false'

# will remove flag files if user exits early
# args: $1 - FUNCNAME
conversion_trap_handler()
{
	# first echo is to clear the top line
	echo ''
	echo $WLINE
	echo "${W}You exited before completing the conversion process."
	echo "Removing all conversion identifier files and exiting now...${N}"
	rm -f $SMDV  $SMDL
	error_handler 'user-killed-conversion' "$1"
}

# args: $1 - repeat
check_debian()
{
	eval $LOGMS
	trap 'conversion_trap_handler $FUNCNAME' INT TERM EXIT
	local opt='' options='' repeat='' optionSet='debian'
	local conversionOptions='aptosid-sources'
	local quitNu='' mepisId='' bSkipQuestion='true'
	local altText1="${S}Adding ${C}Aptosid sources${S} let you run Aptosid kernels."
	
	# dump the ats stuff
	conversionOptions=''
	altText1=""
	
	case $SYSTEM_BASE in
		stable|squeeze|lenny|etch)
			# have to use this for wild card mepis string, mepis-8.x...
			case $DISTRO in
				mepis*)
					mepisId=' Mepis'
					;;
			esac
			conversionOptions=''
			#altText1="${M}It is not safe to run aptosid sources with your${C}$mepisId Debian Stable${M} system\nso those options are not being offered to you, sorry."
			altText1=""
			optionSet='stable'
			;;
		*)
			if [ "$BITS" == '64' -o "$( check_pae_exists )" == 'true' ];then 
				B_OFFER_LIQUORIX_KERNELS='true'
			fi
			;;
	esac

	if [ "$DISTRO" == 'antix' ];then
		conversionOptions='antix-sid ' # removed: antix-sid-aptosid
		altText1="${M}Here are your options for your Anti-X system:"
		optionSet='antix'
		bSkipQuestion='false'
# 	elif [ "$DISTRO" == 'aptosid' ];then
# 		conversionOptions=''
# 		altText1=''
# 		optionSet='aptosid'
	fi
	options="continue-no-change $conversionOptions quit"
	quitNu=$( wc -w <<< $options )

	print_lib_info $LIB_DISTRO_CONVERSION
	echo $MBAR
	echo "${M}You appear to be using Debian or a Debian derived distro based on ${C}Debian $SYSTEM_BASE${S}."
	echo "${S}If you want to run ${C}$SCRIPT_NAME${S}, please select from the following option(s)."
	echo "You will be asked a series of initial setup questions. You will only be asked these once."
	echo
	echo "${W}There are no guarantees, as is the case with all ${C}GPL${W} code."
	echo "${S}However, based on most user's experience, your results should be fine.${S}"
	echo -e "$altText1"
	echo $LINE
	echo "${C}1${S} - ${C}continue-no-change${S} Runs ${C}$SCRIPT_NAME${S} without changing anything."
	echo "    Only ${C}$SCRIPT_NAME${S} fixes will run, and you can use the other script options too."

	case "$optionSet" in
		antix)
			echo "${C}2${S} - ${C}antix-sid${S} Adds sid sources to your apt repos, otherwise no change."
			echo "    This lets you for example run Debian Sid kernels."
# 			echo "${C}3${S} - ${C}antix-sid-aptosid${S} Adds sid sources and aptosid sources, no aptosid package installs."
# 			echo "${C}4${S} - ${C}antix-aptosid-packages${S} Adds sid sources/aptosid sources, installs core aptosid packages."
# 			echo "    ${M}NOTE: This will not ${C}convert${M} your system to aptosid, just install some packages."
# 			echo "    ${M}You must not exit ${C}$SCRIPT_NAME${M} until the entire process is completed."
			;;
# 		aptosid)
# 			echo "    ${M}Please note: ${C}Aptosid${M} users: ${C}$SCRIPT_NAME${M} now will treat"
# 			echo "    Aptosid as a standard Debian derived distro."
# 			echo
# 			echo "    Not all the old distro specific features will be working the way they used"
# 			echo "    to when ${C}sidux${M} existed."
# 			;;
		debian)
# 			echo "${C}2${S} - ${C}aptosid-sources${S} Adds aptosid sources to your apt repos, otherwise no change."
# 			echo "    This lets you for example run Debian Sid with aptosid fixes and kernels."
# 			echo "${C}3${S} - ${C}aptosid-packages${S} Will add aptosid sources and install core aptosid packages."
# 			echo "    ${M}NOTE: This will not ${C}convert${M} your system to aptosid, just install some packages."
# 			echo "    ${M}You must not exit ${C}$SCRIPT_NAME${M} until the entire process is completed."
			:
			;;
	esac

	echo "${C}$quitNu${S} - ${C}quit${S} I don't want to proceed, I'm exiting now."
	echo $LINE
	echo $SLE
	echo $LINE

	options="continue-no-change $conversionOptions quit"
	select opt in $options
	do
		case $opt in
			continue-no-change)
				# tweak_antix_vb_source # only runs if detected so fine for general use
				update_smxi_data
				echo "${S}Ok, you can use ${C}$SCRIPT_NAME${S} with no changes to your system, proceed.${N}"
				trap - INT TERM EXIT
				;;
			antix-sid)
				update_smxi_data
				tweak_antix_sources
				update_to_new_sources 'debian-sid'
				antix_fix_1
				trap - INT TERM EXIT
				;;
			antix-sid-aptosid)
				update_smxi_data
				tweak_antix_sources
				update_to_new_sources 'debian-sid'
				update_to_new_sources 'aptosid'
				run_script_import $LIB_MISC_TWEAKS
				set_default_system_kernel 'conversion'
				antix_fix_1
				trap - INT TERM EXIT
				;;
			antix-aptosid-packages)
				update_smxi_data
				tweak_antix_sources
				update_to_new_sources 'debian-sid'
				update_to_new_sources 'aptosid'
				run_script_import $LIB_MISC_TWEAKS
				set_default_system_kernel 'conversion'
				antix_fix_1
				print_conversion_information
				B_CON_DEB='true'
				trap - INT TERM EXIT
				;;
			aptosid-sources)
				update_smxi_data
				update_to_new_sources 'aptosid'
				run_script_import $LIB_MISC_TWEAKS
				set_default_system_kernel 'conversion'
				trap - INT TERM EXIT
				;;
			aptosid-packages)
				update_smxi_data
				update_to_new_sources 'aptosid'
				run_script_import $LIB_MISC_TWEAKS
				set_default_system_kernel 'conversion'
				print_conversion_information
				B_CON_DEB='true'
				trap - INT TERM EXIT
				;;
			quit)
				print_quit
				;;
			*)
				print_error opt
				repeat='true'
				;;
		esac
		break
	done
	eval $LOGME
	if [ "$repeat" == 'true' ];then
		check_debian 'repeat'
	fi
}

print_conversion_information()
{
	eval $LOGUS
	echo $MLINE
	echo "${C}$SCRIPT_NAME${M} will now proceed to the $DU_UPGRADE, which will update your system to current."
	echo "Do not quit the script until the $DU_UPGRADE and post $DU_UPGRADE aptosid package"
	echo "install is completed!"
	echo ""
	print_hec
	eval $LOGUE
}

install_window_manager()
{
	eval $LOGUS
	echo $MBAR
	echo "${M}Window manager install process"
	echo $LINE
	echo "${S}After the aptosid components are installed, please continue on to the"
	echo "${C}Package Install${S} section which will come next, in ${C}Post $DU_UPGRADE${S}."
	echo "Choose the ${C}display manager${S} option, then first install xorg, then your preferred."
	echo "display manager. For older installs I recommend ${C}xfce${S} or ${C}fvwm crystal${S}.${N}"
	print_hec
	set_sticky_prefs debian-to-aptosid-wm-1
	eval $LOGUE
}

install_aptosid_components()
{
	eval $LOGPS
	local prefId='install-aptosid-packages-1'
	local smPref=$( sm_pref_tester $prefId )
	local aptosidPackages='apt-conf-aptosid configure-cups configure-dsl configure-ndiswrapper ceni deborphan distro-defaults gfxboot-theme-aptosid gpm aptosid-irc aptosid-kernelhacking aptosid-keyrings aptosid-scripts udev-config-aptosid wodim'
	# grub-gfxboot
	local i='' installedPackage=''

	if [ "$smPref" -eq 0 ];then
		echo $MBAR
		echo "${M}SIDUX PACKAGE INSTALL"
		echo $LINE
		echo "${S}This will double check your system to make sure you have the main"
		echo "${C}aptosid${S} packages that you need for basic aptosid functionality."
		echo
		echo "Please read each item and tell ${C}apt${S} if you want it or not by"
		echo "answering ${C}y${S} or ${C}n${S} to $APT_TYPE install questions. For example, "
		echo "if you don't use ${C}ndiswrapper${S} or ${C}dsl${S}, answer ${C}n${S} to those packages.${N}"

		print_hec
		echo "${S}Checking for and installing missing ${C}aptosid${S} packages now...${N}"
		for i in $aptosidPackages
		do
			package_installer "$1" 'install-missing'
		done
		echo "${S}Finished installing ${C}aptosid${S} packages.${N}"
		set_sticky_prefs $prefId
	fi
	eval $LOGPE
}

# this one needs work, not currently functioning
aptosid_graphics()
{
	:
}
aptosid_graphics_legacy()
{
	local prefId='aptosid-graphics-2'
	local smPref=$( sm_pref_tester $prefId ) #$GRUB_PATH
	local OldGrub=$( awk -F= '/^# groot/{print $2}' /boot/grub/menu.lst | sed -r 's/\((.*)\)/\1/' )
	local bm='/boot/message'

	if [ "$1" == 'grub1' -a "$smPref" -eq 0 ];then
		echo $LINE
		echo "${S}Running ${C}aptosid grub${S} fix...${N}"
		# make a copy of old penguin graphic
		if [ -f $bm.hd -a "$DISTRO_LEVEL" -lt 5 ];then
			cp $bm.hd $bm.hd-bu
		fi
		# check for old physical file, move to renamed
		if [ -f $bm ];then
			mv -f $bm $bm.preaptosid
		fi
		# package_installer 'aptosid-graphics aptosid-graphics-common' 'install-always' '--reinstall'

		# force link to file
		if [ -L $bm -o ! -e $bm ];then
			ln -fs message.hd $bm
		else
			echo "${E}No grub graphics file was found. Sorry, script cannot resolve this for you.${N}"
		fi
		echo "${S}Running  ${C}grub-install${S} first time to update grub....${N}"
		grub-install --recheck --no-floppy $OldGrub
		echo "${S}Running  ${C}grub-install${S} again...${N}"
		grub-install --recheck --no-floppy $OldGrub
		echo "${S}Finished with ${C}aptosid grub${S} update and graphics reinstall.${N}"
		set_sticky_prefs $prefId
	fi
}

###---------------------------------------------------------------------
### conversion utilities
###---------------------------------------------------------------------

offer_liquorix_kernel()
{
	eval $LOGUS
	local opt='' options='yes-add-liquorix-sources continue-without-adding-liquorix'
	local repeat='false'
	
	echo $MLINE
	echo "${M}Add ${C}Liquorix${M} Kernel Sources?"
	echo $MLINE
	echo "${S}Selecting ${C}yes-add-liquorix-sources${S} will add ${C}Liquorix${S} kernel apt repositories"
	echo "to your system, after which you will be able to install them in ${C}$SCRIPT_NAME${S}'s"
	echo "${C}Advanced Kernel Install${S} options, or make it your system default in the"
	echo "${C}Miscellaneous Tweaks${S} section."
	echo 
	echo "${C}Liquorix${S} kernels${S} are popular desktop optimized performance kernels."
	echo $LINE
	echo $SLE
	echo $LINE
	select opt in $options
	do
		case $opt in
			yes-add-liquorix-sources)
				run_script_import $LIB_KERNEL
				add_alternate_kernels_sources "liquorix"
				run_script_import $LIB_MISC_TWEAKS
				set_default_system_kernel 'conversion'
				;;
			continue-without-adding-liquorix)
				echo "${S}OK, moving along without adding Liquorix sources...${N}"
				;;
			*)
				print_error opt
				repeat='true'
				;;
		esac
		break
	done
	eval $LOGUE
	if [ "$repeat" == 'true' ];then
		offer_liquorix_kernel
	fi
}

update_smxi_data()
{
	eval $LOGPS
	run_script_import $LIB_MISC_TWEAKS
	if [ "$B_OFFER_LIQUORIX_KERNELS" == 'true' ];then
		offer_liquorix_kernel
	fi
	# this tests for presence of aptitude, and only offers itself if user has aptitude installed
	set_apt_type 'conversion'
	set_upgrade_type 'conversion'
	distro_number_calculator
	set_distro_version # just in case user exits, we'll still have the level set
	eval $LOGPE
}

set_distro_version()
{
	eval $LOGPS
	local repeat='' opt=''

	local distros='
	debian-stable
	debian-testing
	debian-sid
	debian-other
	'

	if [ ! -f $SMDV -a ! -f $EAX ];then
		echo $MLINE
		echo "${M}Set Distro Version Data"
		echo $MLINE
		echo "${S}The folowing Debian versions have been tested at some point, and have worked."
		echo "Since it is very hard to detect for them reliably, please select the distro"
		echo "identier that best fits your system and we can proceed."
		echo "${C}$SCRIPT_NAME ${M}detects your system base as: ${C}Debian $SYSTEM_BASE${S}"
		echo
		echo "This is just an internal ${C}$SCRIPT_NAME${S} script identifier, and will not affect your system."
		echo "${C}$SCRIPT_NAME${S} may use this information to determine which fixes to apply in the future."
		echo
		echo "If you pick ${C}debian-other${S} and ${C}$SCRIPT_NAME${S} works, please notify"
		echo "the script author with the distro so he can add that distro identifier, thanks."
		echo $LINE
		echo $SLE
		echo $LINE
		select opt in $distros
		do
			case $opt in
				debian-stable|debian-testing|debian-sid|debian-other)
					write_smdv_file "$opt"
					;;
				*)
					print_error opt
					repeat='true'
					;;
			esac
			break
		done
		eval $LOGPE
		if [ "$repeat" == 'true' ];then
			set_distro_version
		fi
	elif [ ! -f $SMDV -a -f $EAX ];then
		write_smdv_file 'anti-x'
		eval $LOGPE
	fi
}

# args: $1 which smdv type
write_smdv_file()
{
	eval $LOGUS
	local timeStamp=$( date +%Y%m%d ) fullIdString=''

	fullIdString="$1:sc:$timeStamp"
	echo $fullIdString > $SMDV
	DISTRO_VERSION=$fullIdString
	eval $LOGUE
}

# this is going to just make a rough working guess to avoid running ALL fixes
# data: 2008-1:10;etc To simplify, I'll make each date 3 version back
# arrangement: <year>:<last quarter month number>:<distro equivalent>
distro_number_calculator()
{
	eval $LOGUS
	local year=$( date +%Y )
	local month=$( date +%m )
	local distroYear='' distroMonth='' distroLevel='' item='' assembled=''
	# assume system is reasonably up to date for fixes
	local distroLevels='
	2010:09:20
	2010:12:21
	2011:03:22
	2011:06:23
	2011:09:24
	2011:12:25
	2012:03:26
	2012:06:27
	2012:09:28
	2012:12:29
	2013:03:30
	2013:06:31
	2013:09:32
	2013:12:33
	2014:03:34
	2014:06:35
	2014:09:36
	2014:12:37
	2015:03:38
	2015:06:39
	2015:09:40
	2015:12:41
	'

	if [ ! -f $SMDL ];then
		echo $LINE
		echo "${S}Setting distro level identification for internal script use now...${N}"

		case $month in
			01|02|03)
				month=03
				;;
			04|05|06)
				month=06
				;;
			07|08|09)
				month=09
				;;
			10|11|12)
				month=12
				;;
		esac

		assembled="$year:$month"
		distroLevel=$( grep -Eo "$assembled:[0-9]{1,2}" <<< $distroLevels | cut -d ':' -f 3 )

		# set the distro level id number now
		echo $distroLevel > $SMDL
		DISTRO_LEVEL=$distroLevel
		log_function_data "DISTRO_LEVEL: $DISTRO_LEVEL"
	fi
	eval $LOGUE
}

# args: $1 - which source update
update_to_new_sources()
{
	eval $LOGUS
	local grepSearch=''
	local searchIdentifier=''
	local sourceFile=''
	local sourcesData=''
	local whichUpdate=''
	local doUpdate=''

	case $1 in
		aptosid)
			grepSearch='(aptosid.*[[:space:]](sid|unstable)|deb-sdx)'
			searchIdentifier='aptosid'
			sourceFile='aptosid.list'
			sourcesData='deb http://aptosid.com/debian/ sid main fix.main\n#deb-src http://aptosid.com/debian/ sid main fix.main'
			whichUpdate='aptosid'
			;;
		debian-sid)
			grepSearch='debian\.org.*[[:space:]](sid|unstable)'
			searchIdentifier='Debian Sid'
			sourceFile='debian.list'
			sourcesData='deb http://ftp.uk.debian.org/debian unstable main contrib non-free'
			whichUpdate='Debian Sid'
			;;
	esac
	create_apt_source_item "$grepSearch" "$sourceFile" "$sourcesData" "$searchIdentifier"
	# if we have to add in any sources to sources.list, we'll need to do a new update
	# we have to set the update flag to null here or the main updater
	# won't update the stuff
	if [ "$?" -eq 0 ];then
		doUpdate='true'
	else
		doUpdate='false'
	fi
	update_completion_handler "$doUpdate" $whichUpdate

	# we need to set the APTOSID_SOURCES global now to make sure it's correct
	set_distro_data 'force'
	eval $LOGUE
}

tweak_antix_vb_source()
{
	eval $LOGUS
	local fixVB=$( grep -E '^deb[[:space:]].*virtualbox.*' $EAS )

	if [ -n "$fixVB" ];then
		echo "${S}Commenting out broken virtualbox repo ...${N}"
		sed -i -r 's%^(deb[[:space:]].*virtualbox.*)%##\1%g' $EAS
	fi
	eval $LOGUE
}

tweak_antix_sources()
{
	eval $LOGUS
	local fixDM=$( grep -E '^#.*deb[[:space:]].*ian-mult.*unstable.*' $EAS )
	local fixDS=$( grep -E '^#.*deb[[:space:]].*debian\.org.*unstable.*' $EAS )
	local doUpdate=''

	if [ -n "$fixDM" ];then
		echo "${S}Removing uncommented unstable source...${N}"
		sed -i -r 's%^#.*(deb[[:space:]].*ian-mult.*unstable.*)%\1%g' $EAS
		doUpdate='true'
	fi
	if [ -n "$fixDS" ];then
		echo "${S}Removing uncommented Debian unstable source...${N}"
		sed -i -r 's%^#.*(deb[[:space:]].*debian\.org.*unstable.*)%\1%g' $EAS
		doUpdate='true'
	fi
	# tweak_antix_vb_source

	update_completion_handler "$doUpdate" 'anti-X unstable'
	eval $LOGUE
}

# args: $1 - doUpdate; $2 - which update
update_completion_handler()
{
	eval $LOGUS
	local doUpdate=$1 whichUpdate=$2

	if [ "$doUpdate" == 'true' ];then
		UPDATED=''
		apt_update_handler 'distro-conversion'
	else
		echo "$SPACER${M}You already appear to have ${C}$whichUpdate${M} sources installed, continuing...${N}"
		log_function_data "Sources already installed: $whichUpdate"
	fi
	eval $LOGUE
}

antix_fix_1()
{
# 	eval $LOGPS
# 	run_script_import $LIB_2008_FIXES
# 	libavutil_fix_1
# 	eval $LOGPE
	:
}

###**EOF**###